Searched hist:"48 f7df329474b49d83d0dffec1b6186647f11976" (Results 1 – 1 of 1) sorted by relevance
/linux/mm/ |
H A D | mmap.c | diff 48f7df329474b49d83d0dffec1b6186647f11976 Wed Feb 17 22:11:15 CET 2016 Kirill A. Shutemov <kirill.shutemov@linux.intel.com> mm: fix regression in remap_file_pages() emulation
Grazvydas Ignotas has reported a regression in remap_file_pages() emulation.
Testcase: #define _GNU_SOURCE #include <assert.h> #include <stdlib.h> #include <stdio.h> #include <sys/mman.h>
#define SIZE (4096 * 3)
int main(int argc, char **argv) { unsigned long *p; long i;
p = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) { perror("mmap"); return -1; }
for (i = 0; i < SIZE / 4096; i++) p[i * 4096 / sizeof(*p)] = i;
if (remap_file_pages(p, 4096, 0, 1, 0)) { perror("remap_file_pages"); return -1; }
if (remap_file_pages(p, 4096 * 2, 0, 1, 0)) { perror("remap_file_pages"); return -1; }
assert(p[0] == 1);
munmap(p, SIZE);
return 0; }
The second remap_file_pages() fails with -EINVAL.
The reason is that remap_file_pages() emulation assumes that the target vma covers whole area we want to over map. That assumption is broken by first remap_file_pages() call: it split the area into two vma.
The solution is to check next adjacent vmas, if they map the same file with the same flags.
Fixes: c8d78c1823f4 ("mm: replace remap_file_pages() syscall with emulation") Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Reported-by: Grazvydas Ignotas <notasas@gmail.com> Tested-by: Grazvydas Ignotas <notasas@gmail.com> Cc: <stable@vger.kernel.org> [4.0+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|